package thread;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.util.Arrays;

/**
 * @author SWJ
 * @create 2021-06-24 16:20
 * 本类用来测试反射
 */
public class TestReflaction {
//不用使用main方法

    /**
     * 单元测试方法：是java测试的最小单位
     * 使用灵活语法：要求使用 要加入@Test+void
     * 没有参数+public
     * 返回值为空 是public
     * 注意导包：
     */
    //通过单元测试方法获取类的字节码对象
    @Test
    public void getTest() throws ClassNotFoundException {
        //三种调用方式
        Class<?> student1 = Class.forName("thread.Student");
        Class<?> student2 = Student.class;
        Class<?> student3 = new Student().getClass();

        System.out.println(student1);
        System.out.println(student1.getPackage().getName());
        System.out.println(student1.getSimpleName());
    }

    //3.通过单元测试来获取构造方法
    @Test
    public void getTest2() {

//获取字节码对象Class<?>对象
        Class<?> T1 = Student.class;
        //获取构造方法
        Constructor<?>[] cs = T1.getConstructors();
        //3.通过循环获取每个构造
        //for(遍历得到的每个元素的类型 名字： 遍历元素){}
        for (Constructor c : cs) {
            //本轮循环中拿到的构造函数对象
            System.out.println(c.getName());
            //获取构造函数的名字
            Class[] cp = c.getParameterTypes();
            //获取构造函数参数类型，可能有多少个
            System.out.println(Arrays.toString(cp));
        }

    }

    //通过单元测试获取成员变量
    @Test
    public void getA1() throws Exception {
        Class<?> clazz = Student.class;
        //2.创建对象S
        Object obj = clazz.newInstance();
        //抛出异常
        System.out.println(obj);
        //需要重写student方法
        //thread.Student@5d6f64b1
        // 地址值没有指定的时候就打印的是地址值

        //指定构造方法来创建对象


    }

}
